//
//  main.c
//  SokobanGame
//
//  Created by admin on 2019/7/24.
//  Copyright © 2019 猫爷爷的酱醋茶. All rights reserved.
//

/*
 1.显示地图
 
 2.输入小人的前进方向
 
 3.根据小人的前进方向，移动小人
 
 
 */

#include <stdio.h>
#include <stdlib.h>

#define ROWS     10
//因为“”字符串的结尾必须以‘\0’作为标志
#define COLS    11


//定义地图
char map[ROWS][COLS] =
{
    "##########",
    "#  ####  #",
    "# X####  #",
    "# O      #",
    "######   #",
    "#  ####  #",
    "#        #",
    "#   ######",
    "#         ",
    "##########"
};

//向左移动小人
void moveToLeft(void);

//向上移动小人
void moveToUp(void);

//向下移动小人
void moveToDown(void);

//向右移动小人
void moveToRight(void);

//当前数组坐标位置
int currentRows = 3;
int currentCols = 2;

//更新后的位置
int nextRows;
int nextCols;


//定义用户输入前进方向
char enterDirection(void);

//定义显示地图函数
void showMap(void);

int main(int argc, const char * argv[]) {
    
    int success = 1;
    while (success) {
        
        //刷新地图 -> 清除数据
        system("clear");
        
        //显示地图
        showMap();
        
        if(map[8][9] == 'X'){
            
            printf("恭喜啊，恭喜啊，你完成了～");
            map[8][9] = 'K';
            
            //刷新地图 -> 清除数据
            system("clear");
            
            //显示地图
            showMap();
            break;
            
        }
        
        //让用户输入前进方向
        char dir = enterDirection();
        
        //根据用户输入的方向，移动小人
        switch (dir) {
            case 'a':
            case 'A':
                //向左移动一步
                moveToLeft();
                break;
            case 'w':
            case 'W':
                //向上移动一步
                moveToUp();
                break;
            case 's':
            case 'S':
                //向下移动一步
                moveToDown();
                break;
            case 'd':
            case 'D':
                //向右移动一步
                moveToRight();
                break;
            case 'r':
            case 'R':
                //重新开始
                success = 0;
                break;
            default:
                printf("\n请移动小人...");
                break;
        }
    }
    
    
    return 0;
}


//向左移动小人
void moveToLeft(void)
{
    nextRows = currentRows;
    nextCols = currentCols - 1;
    
    if(map[nextRows][nextCols] == ' '){
        
        map[currentRows][currentCols] = ' ';
        map[nextRows][nextCols] = 'O';
        
        currentCols -= 1;
        
    }else if(map[nextRows][nextCols] == 'X'){
        
        //判断箱子下一个坐标的状态
        if(map[nextRows][nextCols - 1] == ' '){
            map[currentRows][currentCols] = ' ';
            map[nextRows][nextCols - 1] = 'X';
            map[nextRows][nextCols] = 'O';
            
            currentCols -= 1;
        }
        
    }
}

//向上移动小人
void moveToUp(void)
{
    nextRows = currentRows - 1;
    nextCols = currentCols;
    
    if(map[nextRows][nextCols] == ' '){
        
        map[currentRows][currentCols] = ' ';
        map[nextRows][nextCols] = 'O';
        
        currentRows -= 1;
        
    }else if(map[nextRows][nextCols] == 'X'){
        
        //判断箱子下一个坐标的状态
        if(map[nextRows - 1][nextCols] == ' '){
            map[currentRows][currentCols] = ' ';
            map[nextRows - 1][nextCols] = 'X';
            map[nextRows][nextCols] = 'O';
            
            currentRows -= 1;
        }
        
        
        
    }
    
}

//向下移动小人
void moveToDown(void)
{
    
    nextRows = currentRows + 1;
    nextCols = currentCols;
    
    if(map[nextRows][nextCols] == ' '){
        
        map[currentRows][currentCols] = ' ';
        map[nextRows][nextCols] = 'O';
        
        currentRows += 1;
        
    }else if(map[nextRows][nextCols] == 'X'){
        
        //判断箱子下一个坐标的状态
        if(map[nextRows + 1][nextCols] == ' '){
            map[currentRows][currentCols] = ' ';
            map[nextRows + 1][nextCols] = 'X';
            map[nextRows][nextCols] = 'O';
            
            currentRows += 1;
        }
        
        
        
    }
    
}

//向右移动小人
void moveToRight(void)
{
    nextRows = currentRows;
    nextCols = currentCols + 1;
    
    if(map[nextRows][nextCols] == ' '){
        
        map[currentRows][currentCols] = ' ';
        map[nextRows][nextCols] = 'O';
        
        currentCols += 1;
        
    }else if(map[nextRows][nextCols] == 'X'){
        
        //判断箱子下一个坐标的状态
        if(map[nextRows][nextCols + 1] == ' '){
            map[currentRows][currentCols] = ' ';
            map[nextRows][nextCols + 1] = 'X';
            map[nextRows][nextCols] = 'O';
            
            currentCols += 1;
        }
        
    }
}




//实现用户输入前进方向
char enterDirection(void)
{
    
    //1.提醒用户输入小人前进方向
    printf("                  W\n请控制小人推动 A     D       按R.退出游戏 O是小人，X是箱子\n                  S\n");
    
    //2.接收存储输入的小人方向
    char dir;
    //建议先清空scanf的数据缓冲区，再存储
    rewind(stdin);
    scanf("%c",&dir);
    
    //3.将用户的输入返回
    return dir;
    
}


//实现显示地图函数
void showMap()
{
    
    for(int i=0;i<ROWS;i++){
        
        printf("%s\n",map[i]);
        
    }
    
}
